package com.example.cp16;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 使用java8的方式去处理时间格式
 * @author cwy
 */
public class Demo {

    /**
     *  使用Java 8 来处理时间格式
     */
    public static void test1(){
        String dateNow = "2021-10-24 10:00:00";
        // 初始化三个时区
        ZoneId timeZoneSH = ZoneId.of("Asia/Shanghai");
        ZoneId timeZoneNY = ZoneId.of("America/New_York");
        ZoneId timeZoneJST = ZoneOffset.ofHours(9);
        // 格式化器
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        ZonedDateTime of = ZonedDateTime.of(LocalDateTime.parse(dateNow, dtf), timeZoneJST);
        // 通过DateTimeFormatter 格式化时间，通过withZone设置时区.
        DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss Z");
        System.out.println(timeZoneSH.getId() + dtf2.withZone(timeZoneSH).format(of));
        System.out.println(timeZoneNY.getId() + dtf2.withZone(timeZoneNY).format(of));
        System.out.println(timeZoneJST.getId() + dtf2.withZone(timeZoneJST).format(of));

    }

    /**
     * simpleDateFormatter容易出现线程安全问题
     */
    public static void test2(){
        ExecutorService pool = Executors.newFixedThreadPool(100);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (int i =0;i<50;i++){
            pool.execute(()->{
                for (int j =0;j<10;j++){
                    try {
                        simpleDateFormat.parse("2021-10-24 10:00:00");
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        pool.shutdown();
    }

    /**
     * 根据simpleDateFormatter线程不安全推荐使用java8的安全类
     */
    public static void test3(){
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        ExecutorService pool = Executors.newFixedThreadPool(100);
        for (int i =0;i<50;i++){
            pool.execute(()->{
                for (int j = 0;j<10;j++){
                    dateTimeFormatter.parse("2021-10-24 10:00:00");
                }
            });
        }
        pool.shutdown();
    }

    /**
     *  日期计算问题 例如得到30天后的时间
     */
    public static void test4(){
        Date now = new Date();
        Date next = new Date(now.getTime()+30 * 24 *60 *60*1000);
        // 发现根本不是30天后的时间，注意是int溢出了
        System.out.println("now="+now);
        System.out.println("next="+next);
        // 这样就是可以的
        Date next2 = new Date(now.getTime()+30L * 24 * 60 *60 *1000);
        System.out.println("next2="+next2);
    }

    /**
     * 不建议用上面方法去做日期加减，在java8之前建议使用Calendar
     */
    public static void test5(){
        Calendar instance = Calendar.getInstance();
        instance.setTime(new Date());
        instance.add(Calendar.DAY_OF_MONTH,30);
        System.out.println(instance.getTime());
    }

    /**
     * java 8之后使用minus和plus方法
     */
    public static void test6(){
        System.out.println(LocalDate.now()
            .plus(Period.ofMonths(1)));
    }
    public static void main(String[] args) {
        Demo.test6();
    }
}
